/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import util.JPAUtil;

/**
 *
 * @author gilberto.costa
 */
@Entity
@Table(name = "nfe_entrada_cabecalho")
public class NfeEntradaCabecalho implements Serializable {

    private static final Long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "ID")
    private Integer id;
    @Size(max = 20)
    @Column(name = "NUMERO_NFE")
    private String numeroNfe;
    @Size(max = 20)
    @Column(name = "SERIE")
    private String serie;
    @Column(name = "DATA_EMISSAO")
    @Temporal(TemporalType.DATE)
    private Date dataEmissao;
    @Column(name = "VALOR_TOTAL_NFE")
    private BigDecimal valorTotalNfe = new BigDecimal(0);
    @Column(name = "VOLUME_QTD")
    private BigDecimal volumeQtd = new BigDecimal(0);
    @Size(max = 50)
    @Column(name = "ESPECIE_VOLUME")
    private String especieVolume;
    @Column(name = "PESO_LIQUIDO")
    private BigDecimal pesoLiquido = new BigDecimal(0);
    @Column(name = "PESO_BRUTO")
    private BigDecimal pesoBruto = new BigDecimal(0);
    @Basic(optional = false)
    @NotNull
    @ManyToOne
    @JoinColumn(name = "ID_FORNECEDOR")
    private Fornecedor idFornecedor = new Fornecedor();
    @Size(max = 44)
    @Column(name = "CHAVE_ACESSO")
    private String chaveAcesso;
    @Column(name = "DATA_SAIDA")
    @Temporal(TemporalType.DATE)
    private Date dataSaida;
    @Column(name = "BASE_CALCULO_ICMS")
    private BigDecimal baseCalculoIcms = new BigDecimal(0);
    @Column(name = "VALOR_TOTAL_FRETE")
    private BigDecimal valorTotalFrete = new BigDecimal(0);
    @Column(name = "VALOR_ICMS")
    private BigDecimal valorIcms = new BigDecimal(0);
    @Column(name = "BASE_CALCULO_ICMS_ST")
    private BigDecimal baseCalculoIcmsSt = new BigDecimal(0);
    @Column(name = "VALOR_ICMS_SUBSTITUICAO")
    private BigDecimal valorIcmsSubstituicao = new BigDecimal(0);
    @Column(name = "VALOR_TOTAL_PRODUTOS")
    private BigDecimal valorTotalProdutos = new BigDecimal(0);
    @Column(name = "VALOR_FRETE")
    private BigDecimal valorFrete = new BigDecimal(0);
    @Column(name = "VALOR_SEGURO")
    private BigDecimal valorSeguro = new BigDecimal(0);
    @Column(name = "VALOR_OUTRAS_DESPESAS")
    private BigDecimal valorOutrasDespesas = new BigDecimal(0);
    @Column(name = "VALOR_TOTAL_IPI")
    private BigDecimal valorTotalIpi = new BigDecimal(0);
    @Column(name = "VALOR_TOTAL_DESCONTOS")
    private BigDecimal valorTotalDescontos = new BigDecimal(0);
    @Column(name = "VALOR_TOTAL_II")
    private BigDecimal valorTotalIi = new BigDecimal(0);
    @Column(name = "VALOR_PIS")
    private BigDecimal valorPis = new BigDecimal(0);
    @Column(name = "VALOR_COFINS")
    private BigDecimal valorCofins = new BigDecimal(0);
    @Column(name = "DATA_ENTRADA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date data_entrada;
    @Column(name = "EXCLUIDA")
    private Character excluida;
    @OneToMany(mappedBy = "idNfeEntradaCabecalho", fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
    private List<NfeEntradaDetalhe> listDetalhe = new ArrayList<NfeEntradaDetalhe>();

    public NfeEntradaCabecalho() {
    }

    public NfeEntradaCabecalho(Integer id) {
        this.id = id;
    }

    public NfeEntradaCabecalho(Integer id, Fornecedor idFornecedor) {
        this.id = id;
        this.idFornecedor = idFornecedor;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumeroNfe() {
        return numeroNfe;
    }

    public void setNumeroNfe(String numeroNfe) {
        this.numeroNfe = numeroNfe;
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Date dataEmissao) {
        this.dataEmissao = dataEmissao;
    }

    public BigDecimal getValorTotalNfe() {
        return valorTotalNfe;
    }

    public void setValorTotalNfe(BigDecimal valorTotalNfe) {
        this.valorTotalNfe = valorTotalNfe;
    }

    public BigDecimal getVolumeQtd() {
        return volumeQtd;
    }

    public void setVolumeQtd(BigDecimal volumeQtd) {
        this.volumeQtd = volumeQtd;
    }

    public String getEspecieVolume() {
        return especieVolume;
    }

    public void setEspecieVolume(String especieVolume) {
        this.especieVolume = especieVolume;
    }

    public BigDecimal getPesoLiquido() {
        return pesoLiquido;
    }

    public void setPesoLiquido(BigDecimal pesoLiquido) {
        this.pesoLiquido = pesoLiquido;
    }

    public BigDecimal getPesoBruto() {
        return pesoBruto;
    }

    public void setPesoBruto(BigDecimal pesoBruto) {
        this.pesoBruto = pesoBruto;
    }

    public Fornecedor getIdFornecedor() {
        return idFornecedor;
    }

    public void setIdFornecedor(Fornecedor idFornecedor) {
        this.idFornecedor = idFornecedor;
    }

    public String getChaveAcesso() {
        return chaveAcesso;
    }

    public void setChaveAcesso(String chaveAcesso) {
        this.chaveAcesso = chaveAcesso;
    }

    public Date getDataSaida() {
        return dataSaida;
    }

    public void setDataSaida(Date dataSaida) {
        this.dataSaida = dataSaida;
    }

    public BigDecimal getBaseCalculoIcms() {
        return baseCalculoIcms;
    }

    public void setBaseCalculoIcms(BigDecimal baseCalculoIcms) {
        this.baseCalculoIcms = baseCalculoIcms;
    }

    public BigDecimal getValorTotalFrete() {
        return valorTotalFrete;
    }

    public void setValorTotalFrete(BigDecimal valorTotalFrete) {
        this.valorTotalFrete = valorTotalFrete;
    }

    public BigDecimal getValorIcms() {
        return valorIcms;
    }

    public void setValorIcms(BigDecimal valorIcms) {
        this.valorIcms = valorIcms;
    }

    public BigDecimal getBaseCalculoIcmsSt() {
        return baseCalculoIcmsSt;
    }

    public void setBaseCalculoIcmsSt(BigDecimal baseCalculoIcmsSt) {
        this.baseCalculoIcmsSt = baseCalculoIcmsSt;
    }

    public BigDecimal getValorIcmsSubstituicao() {
        return valorIcmsSubstituicao;
    }

    public void setValorIcmsSubstituicao(BigDecimal valorIcmsSubstituicao) {
        this.valorIcmsSubstituicao = valorIcmsSubstituicao;
    }

    public BigDecimal getValorTotalProdutos() {
        return valorTotalProdutos;
    }

    public void setValorTotalProdutos(BigDecimal valorTotalProdutos) {
        this.valorTotalProdutos = valorTotalProdutos;
    }

    public BigDecimal getValorFrete() {
        return valorFrete;
    }

    public void setValorFrete(BigDecimal valorFrete) {
        this.valorFrete = valorFrete;
    }

    public BigDecimal getValorSeguro() {
        return valorSeguro;
    }

    public void setValorSeguro(BigDecimal valorSeguro) {
        this.valorSeguro = valorSeguro;
    }

    public BigDecimal getValorOutrasDespesas() {
        return valorOutrasDespesas;
    }

    public void setValorOutrasDespesas(BigDecimal valorOutrasDespesas) {
        this.valorOutrasDespesas = valorOutrasDespesas;
    }

    public BigDecimal getValorTotalIpi() {
        return valorTotalIpi;
    }

    public void setValorTotalIpi(BigDecimal valorTotalIpi) {
        this.valorTotalIpi = valorTotalIpi;
    }

    public BigDecimal getValorTotalDescontos() {
        return valorTotalDescontos;
    }

    public void setValorTotalDescontos(BigDecimal valorTotalDescontos) {
        this.valorTotalDescontos = valorTotalDescontos;
    }

    public BigDecimal getValorTotalIi() {
        return valorTotalIi;
    }

    public void setValorTotalIi(BigDecimal valorTotalIi) {
        this.valorTotalIi = valorTotalIi;
    }

    public BigDecimal getValorPis() {
        return valorPis;
    }

    public void setValorPis(BigDecimal valorPis) {
        this.valorPis = valorPis;
    }

    public BigDecimal getValorCofins() {
        return valorCofins;
    }

    public void setValorCofins(BigDecimal valorCofins) {
        this.valorCofins = valorCofins;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof NfeEntradaCabecalho)) {
            return false;
        }
        NfeEntradaCabecalho other = (NfeEntradaCabecalho) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.modelo.NfeEntradaCabecalho[ id=" + id + " ]";
    }

    /**
     * @return the listDetalhe
     */
    public List<NfeEntradaDetalhe> getListDetalhe() {
        return listDetalhe;
    }

    /**
     * @param listDetalhe the listDetalhe to set
     */
    public void setListDetalhe(List<NfeEntradaDetalhe> listDetalhe) {
        this.listDetalhe = listDetalhe;
    }

    /**
     * @return the data_entrada
     */
    public Date getData_entrada() {
        return data_entrada;
    }

    /**
     * @param data_entrada the data_entrada to set
     */
    public void setData_entrada(Date data_entrada) {
        this.data_entrada = data_entrada;
    }

    public NfeEntradaCabecalho salvar() {
        return (NfeEntradaCabecalho) JPAUtil.mergeObjeto(this);
    }

    public static List<NfeEntradaCabecalho> retornaNotas() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM NfeEntradaCabecalho n WHERE n.excluida = 'N'");
        List<NfeEntradaCabecalho> list = q.getResultList();
        em.close();
        return list;
    }

    public static NfeEntradaCabecalho retornaNotaPorId(Integer idEdicao) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM NfeEntradaCabecalho f WHERE f.id = ? AND f.excluida = 'N'");
        q.setParameter(1, idEdicao);
        NfeEntradaCabecalho retorno;
        try {
            retorno = (NfeEntradaCabecalho) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public void excluir() {
        JPAUtil.delete(this);
    }

    /**
     * @return the excluida
     */
    public Character getExcluida() {
        return excluida;
    }

    /**
     * @param excluida the excluida to set
     */
    public void setExcluida(Character excluida) {
        this.excluida = excluida;
    }
}
